package org.jeecg.modules.mes.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mes.entity.MesProductionPlan;
import org.jeecg.modules.mes.entity.MesProductionPlanTask;
import org.jeecg.modules.mes.vo.MesCreatePlanFromTemplateVO;
import org.jeecg.modules.mes.vo.MesCustomPlanCreateVO;
import org.jeecg.modules.mes.vo.MesProductionPlanVO;
import org.jeecg.modules.mes.vo.MesMergedPlanCreateVO;
import org.jeecg.modules.mes.vo.MesProductionPlanDetailVO;
import org.jeecg.modules.oms.entity.ProductSalesOrder;

import java.util.List;

/**
 * @Description: 生产计划管理
 * @Author: jeecg-boot
 * @Date: 2025-01-21
 * @Version: V1.0
 */
public interface IMesProductionPlanService extends IService<MesProductionPlan> {

    /**
     * 基于模板创建生产计划
     * @param createVO 创建参数
     * @return 生产计划ID
     */
    String createPlanFromTemplate(MesCreatePlanFromTemplateVO createVO);

    /**
     * 自定义创建生产计划
     * @param createVO 创建参数
     * @return 生产计划ID
     */
    String createCustomPlan(MesCustomPlanCreateVO createVO);

    /**
     * 获取可领取的任务
     * @param employeeId 员工ID
     * @param workTypeId 工种ID（可选）
     * @return 任务列表
     */
    List<MesProductionPlanTask> getAvailableTasks(String employeeId, String workTypeId);

    /**
     * 领取任务
     * @param taskId 任务ID
     * @param employeeId 员工ID
     */
    void claimTask(String taskId, String employeeId);

    /**
     * 获取我的任务
     * @param employeeId 员工ID
     * @return 任务列表
     */
    List<MesProductionPlanTask> getMyTasks(String employeeId);

    /**
     * 审核生产计划
     * @param planId 计划ID
     * @param approved 是否通过
     * @param remark 审核备注
     */
    void approvePlan(String planId, Boolean approved, String remark);

    /**
     * 下发生产计划
     * @param planId 计划ID
     */
    void issuePlan(String planId);

    /**
     * 获取生产计划详情（包含任务信息）
     * @param planId 计划ID
     * @return 计划详情
     */
    MesProductionPlanVO getPlanDetail(String planId);

    /**
     * 生成计划编号
     * @return 计划编号
     */
    String generatePlanNo();

    /**
     * 更新计划进度
     * @param planId 计划ID
     */
    void updatePlanProgress(String planId);

    /**
     * 检查员工是否有权限领取指定工种的任务
     * @param employeeId 员工ID
     * @param workTypeId 工种ID
     * @return 是否有权限
     */
    boolean checkEmployeeWorkTypePermission(String employeeId, String workTypeId);

    /**
     * 获取可以生成成品入库单的订单
     * 查询包装入库工种且状态为已完成的任务对应的订单
     * @return 订单列表
     */
    List<ProductSalesOrder> getFinishedOrdersForInbound();

    /**
     * 创建多订单明细合并计划
     * @param createVO 创建参数
     * @return 生产计划ID
     */
    String createMergedPlan(MesMergedPlanCreateVO createVO);

    /**
     * 获取计划的详细信息（包含订单明细和任务参与者）
     * @param planId 计划ID
     * @return 计划详情
     */
    MesProductionPlanDetailVO getDetailedPlan(String planId);

    /**
     * 检查订单明细是否可以添加到计划中
     * @param planId 计划ID
     * @param orderDetailIds 订单明细ID列表
     * @return 是否可以添加
     */
    boolean canAddOrderDetailsToPlan(String planId, List<String> orderDetailIds);

    /**
     * 为计划添加更多订单明细
     * @param planId 计划ID
     * @param orderDetailIds 订单明细ID列表
     * @return 是否成功
     */
    boolean addOrderDetailsToPlan(String planId, List<String> orderDetailIds);

    /**
     * 从计划中移除订单明细
     * @param planId 计划ID
     * @param orderDetailIds 订单明细ID列表
     * @return 是否成功
     */
    boolean removeOrderDetailsFromPlan(String planId, List<String> orderDetailIds);

    /**
     * 领取生产计划
     * @param planId 计划ID
     * @param employeeId 员工ID
     * @param remark 备注
     */
    void claimPlan(String planId, String employeeId, String remark);

    /**
     * 开始生产计划
     * @param planId 计划ID
     * @param employeeId 员工ID
     */
    void startPlan(String planId, String employeeId);

    /**
     * 暂停生产计划
     * @param planId 计划ID
     * @param employeeId 员工ID
     */
    void pausePlan(String planId, String employeeId);

    /**
     * 恢复生产计划
     * @param planId 计划ID
     * @param employeeId 员工ID
     */
    void resumePlan(String planId, String employeeId);

    /**
     * 完成生产计划
     * @param planId 计划ID
     * @param employeeId 员工ID
     * @param completedQuantity 完成数量
     * @param actualHours 实际工时
     * @param remark 备注
     */
    void completePlan(String planId, String employeeId, Integer completedQuantity, Double actualHours, String remark);

    /**
     * 根据任务领取人获取参与的计划列表
     * @param employeeId 员工ID
     * @param planStatus 计划状态
     * @param pageNo 页码
     * @param pageSize 页大小
     * @return 分页结果
     */
    com.baomidou.mybatisplus.core.metadata.IPage<MesProductionPlan> getPlansByTaskOwnership(String employeeId, Integer planStatus, Integer pageNo, Integer pageSize);
}
